Load Packages

Creat Function to change txt to csvs, and then merge into one usable dataframe

CREATE FUNCTION TO CHANGE TXT TO CSV

convert txt to csv function

BATCH 1

set path of main folder

list all participant folders

list all nested folders

loop through each participant folder to find nested folders

initialise a list to hold CSV file paths

loop through each participant folder

read all csv files into a list of data frames

Change subject_pair to a character, so it is compatible with the dataframe merge later

Create csv of merged, raw data

BATCH 2

set path of main folder

list all participant folders

list all nested folders

loop through each participant folder to find nested folders

initialise a list to hold CSV file paths

loop through each participant folder

read all csv files into a list of data frames

Create csv of merged, raw data

BATCH 3

set path of main folder

list all participant folders

list all nested folders

loop through each participant folder to find nested folders

initialise a list to hold CSV file paths

loop through each participant folder

read all csv files into a list of data frames

Create csv of merged, raw data

BATCH 4

set path of main folder

list all participant folders

list all nested folders

loop through each participant folder to find nested folders

initialise a list to hold CSV file paths

loop through each participant folder

read all csv files into a list of data frames

Create csv of merged, raw data

BATCH 5

set path of main folder

list all participant folders

list all nested folders

loop through each participant folder to find nested folders

initialise a list to hold CSV file paths

loop through each participant folder

read all csv files into a list of data frames

Create csv of merged, raw data

BIG MERGE

Now merge the datasets together to create the master dataset

Create csv of merged, raw data

LS0tDQp0aXRsZTogIlBpbG90IFBhaXJzIEZ1bGwgQ1NWIENyZWF0ZSAiDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyBMb2FkIFBhY2thZ2VzICMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpgYGB7cn0NCmxpYnJhcnkocGx5cikNCmxpYnJhcnkoInBhcGFqYSIpDQpsaWJyYXJ5KCd0aWR5dmVyc2UnKQ0Kcl9yZWZzKCJyLXJlZmVyZW5jZXMuYmliIikNCmBgYA0KDQoNCg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgQ3JlYXQgRnVuY3Rpb24gdG8gY2hhbmdlIHR4dCB0byBjc3ZzLCBhbmQgdGhlbiBtZXJnZSBpbnRvIG9uZSB1c2FibGUgZGF0YWZyYW1lICMjDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KDQpDUkVBVEUgRlVOQ1RJT04gVE8gQ0hBTkdFIFRYVCBUTyBDU1YgDQoNCg0KY29udmVydCB0eHQgdG8gY3N2IGZ1bmN0aW9uDQoNCmBgYHtyfQ0KY29udmVydF90eHRfdG9fY3N2IDwtIGZ1bmN0aW9uKHR4dF9maWxlKSB7DQogICMgUmVhZCB0aGUgVFhUIGZpbGUNCiAgZGF0YSA8LSByZWFkLnRhYmxlKHR4dF9maWxlLCBoZWFkZXIgPSBUUlVFLCBzZXAgPSAiLCIsIGZpbGwgPSBUUlVFKSANCiAgDQogICMgRGVmaW5lIHRoZSBDU1YgZmlsZSBwYXRoDQogIGNzdl9maWxlIDwtIHN1YigiXFwudHh0JCIsICIuY3N2IiwgdHh0X2ZpbGUpDQogIA0KICAjIFdyaXRlIHRvIENTVg0KICB3cml0ZS5jc3YoZGF0YSwgZmlsZSA9IGNzdl9maWxlLCByb3cubmFtZXMgPSBGQUxTRSkNCiAgDQogIHJldHVybihjc3ZfZmlsZSkNCn0NCg0KYGBgDQoNCg0KDQpCQVRDSCAxDQoNCnNldCBwYXRoIG9mIG1haW4gZm9sZGVyDQpgYGB7cn0NCmZvbGRlcl9wYXRoIDwtICIuLi9BbGxfYmF0Y2hlc19kYXRhL2JhdGNoXzEiDQpgYGANCg0KDQpsaXN0IGFsbCBwYXJ0aWNpcGFudCBmb2xkZXJzDQpgYGB7cn0NCnBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2gxIDwtIGxpc3QuZGlycyhwYXRoID0gZm9sZGVyX3BhdGgsIGZ1bGwubmFtZXMgPSBUUlVFLCByZWN1cnNpdmUgPSBGQUxTRSkNCnBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2gxDQpgYGANCg0KbGlzdCBhbGwgbmVzdGVkIGZvbGRlcnMNCmBgYHtyfQ0KbmVzdGVkX2ZvbGRlcnNfYmF0Y2gxIDwtIGxpc3QoImJhdGNoXzEiKQ0KbmVzdGVkX2ZvbGRlcnNfYmF0Y2gxDQpgYGANCg0KbG9vcCB0aHJvdWdoIGVhY2ggcGFydGljaXBhbnQgZm9sZGVyIHRvIGZpbmQgbmVzdGVkIGZvbGRlcnMNCmBgYHtyfQ0KZm9yIChmb2xkZXJfMSBpbiBwYXJ0aWNpcGFudF9mb2xkZXJzX2JhdGNoMSkgew0KICBuZXN0ZWRfZm9sZGVyX2JhdGNoMSA8LSBsaXN0LmRpcnMocGF0aCA9IGZvbGRlcl8xLCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpDQogIG5lc3RlZF9mb2xkZXJzX2JhdGNoMSA8LSBjKG5lc3RlZF9mb2xkZXJzX2JhdGNoMSwgbmVzdGVkX2ZvbGRlcl9iYXRjaDEpDQp9DQpuZXN0ZWRfZm9sZGVyc19iYXRjaDENCmBgYA0KDQoNCmluaXRpYWxpc2UgYSBsaXN0IHRvIGhvbGQgQ1NWIGZpbGUgcGF0aHMNCmBgYHtyfQ0KY3N2X2ZpbGVzX2JhdGNoMSA8LSBsaXN0KCkNCmBgYA0KDQoNCmxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpY2lwYW50IGZvbGRlcg0KYGBge3J9DQpmb3IgKGZvbGRlciBpbiBuZXN0ZWRfZm9sZGVyc19iYXRjaDEpIHsNCiAgdHh0X2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IGZvbGRlciwgcGF0dGVybj0gIlxcLnR4dCQiLCBmdWxsLm5hbWVzID0gVFJVRSkNCiAgY3N2X2ZpbGVzX2JhdGNoMSA8LSBjKGNzdl9maWxlc19iYXRjaDEsIGxhcHBseSh0eHRfZmlsZXMsIGNvbnZlcnRfdHh0X3RvX2NzdikpDQp9DQpgYGANCg0KDQpyZWFkIGFsbCBjc3YgZmlsZXMgaW50byBhIGxpc3Qgb2YgZGF0YSBmcmFtZXMNCmBgYHtyfQ0KZGF0YV9mcmFtZXNfYmF0Y2gxIDwtIGxhcHBseShjc3ZfZmlsZXNfYmF0Y2gxLCByZWFkLmNzdikNCmBgYA0KDQoNCmBgYHtyfQ0KbWVyZ2VkX2RmX2JhdGNoMSA8LSBkby5jYWxsKHJiaW5kLmZpbGwsIGRhdGFfZnJhbWVzX2JhdGNoMSkNCm1lcmdlZF9kZl9iYXRjaDEgPC0gZGlzdGluY3QobWVyZ2VkX2RmX2JhdGNoMSkNCnByaW50KG1lcmdlZF9kZl9iYXRjaDEpDQpgYGANCg0KQ2hhbmdlIHN1YmplY3RfcGFpciB0byBhIGNoYXJhY3Rlciwgc28gaXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBkYXRhZnJhbWUgbWVyZ2UgbGF0ZXINCg0KDQpgYGB7cn0NCm1lcmdlZF9kZl9iYXRjaDEkc3ViamVjdF9wYWlyIDwtIGFzLmludGVnZXIobWVyZ2VkX2RmX2JhdGNoMSRzdWJqZWN0X3BhaXIpDQptZXJnZWRfZGZfYmF0Y2gxJHN1YmplY3RfaWRlbnRpZmllciA8LSBhcy5pbnRlZ2VyKG1lcmdlZF9kZl9iYXRjaDEkc3ViamVjdF9pZGVudGlmaWVyKQ0KbWVyZ2VkX2RmX2JhdGNoMQ0KYGBgDQoNCg0KQ3JlYXRlIGNzdiBvZiBtZXJnZWQsIHJhdyBkYXRhDQpgYGB7cn0NCndyaXRlLmNzdihtZXJnZWRfZGZfYmF0Y2gxLCAiYmF0Y2hfMV9tZXJnZWRfZGYuY3N2IikNCmBgYA0KDQoNCg0KQkFUQ0ggMg0KDQoNCnNldCBwYXRoIG9mIG1haW4gZm9sZGVyDQpgYGB7cn0NCmZvbGRlcl9wYXRoXzIgPC0gIi4uL0FsbF9iYXRjaGVzX2RhdGEvYmF0Y2hfMiINCmBgYA0KDQoNCmxpc3QgYWxsIHBhcnRpY2lwYW50IGZvbGRlcnMNCmBgYHtyfQ0KcGFydGljaXBhbnRfZm9sZGVyc19iYXRjaDIgPC0gbGlzdC5kaXJzKHBhdGggPSBmb2xkZXJfcGF0aF8yLCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpDQpwYXJ0aWNpcGFudF9mb2xkZXJzX2JhdGNoMg0KYGBgDQoNCmxpc3QgYWxsIG5lc3RlZCBmb2xkZXJzDQpgYGB7cn0NCm5lc3RlZF9mb2xkZXJzX2JhdGNoMiA8LSBsaXN0KCJiYXRjaF8yIikNCm5lc3RlZF9mb2xkZXJzX2JhdGNoMg0KYGBgDQoNCmxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpY2lwYW50IGZvbGRlciB0byBmaW5kIG5lc3RlZCBmb2xkZXJzDQpgYGB7cn0NCmZvciAoZm9sZGVyIGluIHBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2gyKSB7DQogIG5lc3RlZF9mb2xkZXJfYmF0Y2gyIDwtIGxpc3QuZGlycyhwYXRoID0gZm9sZGVyLCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpDQogIG5lc3RlZF9mb2xkZXJzX2JhdGNoMiA8LSBjKG5lc3RlZF9mb2xkZXJzX2JhdGNoMiwgbmVzdGVkX2ZvbGRlcl9iYXRjaDIpDQp9DQpuZXN0ZWRfZm9sZGVyc19iYXRjaDINCmBgYA0KDQoNCg0KaW5pdGlhbGlzZSBhIGxpc3QgdG8gaG9sZCBDU1YgZmlsZSBwYXRocw0KYGBge3J9DQpjc3ZfZmlsZXNfYmF0Y2gyIDwtIGxpc3QoKQ0KYGBgDQoNCg0KbG9vcCB0aHJvdWdoIGVhY2ggcGFydGljaXBhbnQgZm9sZGVyDQpgYGB7cn0NCmZvciAoZm9sZGVyIGluIG5lc3RlZF9mb2xkZXJzX2JhdGNoMikgew0KICB0eHRfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gZm9sZGVyLCBwYXR0ZXJuPSAiXFwudHh0JCIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICBjc3ZfZmlsZXNfYmF0Y2gyIDwtIGMoY3N2X2ZpbGVzX2JhdGNoMiwgbGFwcGx5KHR4dF9maWxlcywgY29udmVydF90eHRfdG9fY3N2KSkNCn0NCmBgYA0KDQoNCnJlYWQgYWxsIGNzdiBmaWxlcyBpbnRvIGEgbGlzdCBvZiBkYXRhIGZyYW1lcw0KYGBge3J9DQpkYXRhX2ZyYW1lc19iYXRjaDIgPC0gbGFwcGx5KGNzdl9maWxlc19iYXRjaDIsIHJlYWQuY3N2KQ0KYGBgDQoNCg0KYGBge3J9DQptZXJnZWRfZGZfYmF0Y2gyIDwtIGRvLmNhbGwocmJpbmQuZmlsbCwgZGF0YV9mcmFtZXNfYmF0Y2gyKQ0KbWVyZ2VkX2RmX2JhdGNoMiA8LSBkaXN0aW5jdChtZXJnZWRfZGZfYmF0Y2gyKQ0KcHJpbnQobWVyZ2VkX2RmX2JhdGNoMikNCmBgYA0KDQpDcmVhdGUgY3N2IG9mIG1lcmdlZCwgcmF3IGRhdGENCmBgYHtyfQ0Kd3JpdGUuY3N2KG1lcmdlZF9kZl9iYXRjaDIsICJwYWlyc18yX21lcmdlZF9kZi5jc3YiKQ0KYGBgDQoNCg0KDQpCQVRDSCAzDQoNCg0Kc2V0IHBhdGggb2YgbWFpbiBmb2xkZXINCmBgYHtyfQ0KZm9sZGVyX3BhdGhfMyA8LSAiLi4vQWxsX2JhdGNoZXNfZGF0YS9iYXRjaF8zIg0KYGBgDQoNCg0KbGlzdCBhbGwgcGFydGljaXBhbnQgZm9sZGVycw0KYGBge3J9DQpwYXJ0aWNpcGFudF9mb2xkZXJzX2JhdGNoMyA8LSBsaXN0LmRpcnMocGF0aCA9IGZvbGRlcl9wYXRoXzMsIGZ1bGwubmFtZXMgPSBUUlVFLCByZWN1cnNpdmUgPSBGQUxTRSkNCnBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2gzDQpgYGANCg0KbGlzdCBhbGwgbmVzdGVkIGZvbGRlcnMNCmBgYHtyfQ0KbmVzdGVkX2ZvbGRlcnNfYmF0Y2gzIDwtIGxpc3QoImJhdGNoXzMiKQ0KYGBgDQoNCmxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpY2lwYW50IGZvbGRlciB0byBmaW5kIG5lc3RlZCBmb2xkZXJzDQpgYGB7cn0NCmZvciAoZm9sZGVyIGluIHBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2gzKSB7DQogIG5lc3RlZF9mb2xkZXJfYmF0Y2gzIDwtIGxpc3QuZGlycyhwYXRoID0gZm9sZGVyLCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpDQogIG5lc3RlZF9mb2xkZXJzX2JhdGNoMyA8LSBjKG5lc3RlZF9mb2xkZXJzX2JhdGNoMywgbmVzdGVkX2ZvbGRlcl9iYXRjaDMpDQp9DQpuZXN0ZWRfZm9sZGVyc19iYXRjaDMNCmBgYA0KDQoNCg0KaW5pdGlhbGlzZSBhIGxpc3QgdG8gaG9sZCBDU1YgZmlsZSBwYXRocw0KYGBge3J9DQpjc3ZfZmlsZXNfYmF0Y2gzIDwtIGxpc3QoKQ0KYGBgDQoNCg0KbG9vcCB0aHJvdWdoIGVhY2ggcGFydGljaXBhbnQgZm9sZGVyDQpgYGB7cn0NCmZvciAoZm9sZGVyIGluIG5lc3RlZF9mb2xkZXJzX2JhdGNoMykgew0KICB0eHRfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gZm9sZGVyLCBwYXR0ZXJuPSAiXFwudHh0JCIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICBjc3ZfZmlsZXNfYmF0Y2gzIDwtIGMoY3N2X2ZpbGVzX2JhdGNoMywgbGFwcGx5KHR4dF9maWxlcywgY29udmVydF90eHRfdG9fY3N2KSkNCn0NCmBgYA0KDQoNCnJlYWQgYWxsIGNzdiBmaWxlcyBpbnRvIGEgbGlzdCBvZiBkYXRhIGZyYW1lcw0KYGBge3J9DQpkYXRhX2ZyYW1lc19iYXRjaDMgPC0gbGFwcGx5KGNzdl9maWxlc19iYXRjaDMsIHJlYWQuY3N2KQ0KZGF0YV9mcmFtZXNfYmF0Y2gzDQpgYGANCg0KDQpgYGB7cn0NCm1lcmdlZF9kZl9iYXRjaDMgPC0gZG8uY2FsbChyYmluZC5maWxsLCBkYXRhX2ZyYW1lc19iYXRjaDMpDQptZXJnZWRfZGZfYmF0Y2gzIDwtIGRpc3RpbmN0KG1lcmdlZF9kZl9iYXRjaDMpDQpwcmludChtZXJnZWRfZGZfYmF0Y2gzKQ0KYGBgDQoNCkNyZWF0ZSBjc3Ygb2YgbWVyZ2VkLCByYXcgZGF0YQ0KYGBge3J9DQp3cml0ZS5jc3YobWVyZ2VkX2RmX2JhdGNoMywgInBhaXJzXzNfbWVyZ2VkX2RmLmNzdiIpDQpgYGANCg0KDQoNCkJBVENIIDQNCg0Kc2V0IHBhdGggb2YgbWFpbiBmb2xkZXINCmBgYHtyfQ0KZm9sZGVyX3BhdGhfNCA8LSAiLi4vQWxsX2JhdGNoZXNfZGF0YS9iYXRjaF80Ig0KYGBgDQoNCg0KbGlzdCBhbGwgcGFydGljaXBhbnQgZm9sZGVycw0KYGBge3J9DQpwYXJ0aWNpcGFudF9mb2xkZXJzX2JhdGNoNCA8LSBsaXN0LmRpcnMocGF0aCA9IGZvbGRlcl9wYXRoXzQsIGZ1bGwubmFtZXMgPSBUUlVFLCByZWN1cnNpdmUgPSBGQUxTRSkNCnBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2g0DQpgYGANCg0KbGlzdCBhbGwgbmVzdGVkIGZvbGRlcnMNCmBgYHtyfQ0KbmVzdGVkX2ZvbGRlcnNfYmF0Y2g0IDwtIGxpc3QoImJhdGNoXzQiKQ0KYGBgDQoNCmxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpY2lwYW50IGZvbGRlciB0byBmaW5kIG5lc3RlZCBmb2xkZXJzDQpgYGB7cn0NCmZvciAoZm9sZGVyIGluIHBhcnRpY2lwYW50X2ZvbGRlcnNfYmF0Y2g0KSB7DQogIG5lc3RlZF9mb2xkZXJfYmF0Y2g0IDwtIGxpc3QuZGlycyhwYXRoID0gZm9sZGVyLCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpDQogIG5lc3RlZF9mb2xkZXJzX2JhdGNoNCA8LSBjKG5lc3RlZF9mb2xkZXJzX2JhdGNoNCwgbmVzdGVkX2ZvbGRlcl9iYXRjaDQpDQp9DQpuZXN0ZWRfZm9sZGVyc19iYXRjaDQNCmBgYA0KDQoNCg0KaW5pdGlhbGlzZSBhIGxpc3QgdG8gaG9sZCBDU1YgZmlsZSBwYXRocw0KYGBge3J9DQpjc3ZfZmlsZXNfYmF0Y2g0IDwtIGxpc3QoKQ0KYGBgDQoNCg0KbG9vcCB0aHJvdWdoIGVhY2ggcGFydGljaXBhbnQgZm9sZGVyDQpgYGB7cn0NCmZvciAoZm9sZGVyIGluIG5lc3RlZF9mb2xkZXJzX2JhdGNoNCkgew0KICB0eHRfZmlsZXMgPC0gbGlzdC5maWxlcyhwYXRoID0gZm9sZGVyLCBwYXR0ZXJuPSAiXFwudHh0JCIsIGZ1bGwubmFtZXMgPSBUUlVFKQ0KICBjc3ZfZmlsZXNfYmF0Y2g0IDwtIGMoY3N2X2ZpbGVzX2JhdGNoNCwgbGFwcGx5KHR4dF9maWxlcywgY29udmVydF90eHRfdG9fY3N2KSkNCn0NCmBgYA0KDQoNCnJlYWQgYWxsIGNzdiBmaWxlcyBpbnRvIGEgbGlzdCBvZiBkYXRhIGZyYW1lcw0KYGBge3J9DQpkYXRhX2ZyYW1lc19iYXRjaDQgPC0gbGFwcGx5KGNzdl9maWxlc19iYXRjaDQsIHJlYWQuY3N2KQ0KYGBgDQoNCg0KYGBge3J9DQptZXJnZWRfZGZfYmF0Y2g0IDwtIGRvLmNhbGwocmJpbmQuZmlsbCwgZGF0YV9mcmFtZXNfYmF0Y2g0KQ0KbWVyZ2VkX2RmX2JhdGNoNCA8LSBkaXN0aW5jdChtZXJnZWRfZGZfYmF0Y2g0KQ0KcHJpbnQobWVyZ2VkX2RmX2JhdGNoNCkNCmBgYA0KDQpDcmVhdGUgY3N2IG9mIG1lcmdlZCwgcmF3IGRhdGENCmBgYHtyfQ0Kd3JpdGUuY3N2KG1lcmdlZF9kZl9iYXRjaDQsICJwYWlyc180X21lcmdlZF9kZi5jc3YiKQ0KYGBgDQoNCg0KDQpCQVRDSCA1DQoNCnNldCBwYXRoIG9mIG1haW4gZm9sZGVyDQpgYGB7cn0NCmZvbGRlcl9wYXRoXzUgPC0gIi4uL0FsbF9iYXRjaGVzX2RhdGEvYmF0Y2hfNSINCmBgYA0KDQoNCmxpc3QgYWxsIHBhcnRpY2lwYW50IGZvbGRlcnMNCmBgYHtyfQ0KcGFydGljaXBhbnRfZm9sZGVyc19iYXRjaDUgPC0gbGlzdC5kaXJzKHBhdGggPSBmb2xkZXJfcGF0aF81LCBmdWxsLm5hbWVzID0gVFJVRSwgcmVjdXJzaXZlID0gRkFMU0UpDQpwYXJ0aWNpcGFudF9mb2xkZXJzX2JhdGNoNQ0KYGBgDQoNCmxpc3QgYWxsIG5lc3RlZCBmb2xkZXJzDQpgYGB7cn0NCm5lc3RlZF9mb2xkZXJzX2JhdGNoNSA8LSBsaXN0KCJiYXRjaF81IikNCmBgYA0KDQpsb29wIHRocm91Z2ggZWFjaCBwYXJ0aWNpcGFudCBmb2xkZXIgdG8gZmluZCBuZXN0ZWQgZm9sZGVycw0KYGBge3J9DQpmb3IgKGZvbGRlciBpbiBwYXJ0aWNpcGFudF9mb2xkZXJzX2JhdGNoNSkgew0KICBuZXN0ZWRfZm9sZGVyX2JhdGNoNSA8LSBsaXN0LmRpcnMocGF0aCA9IGZvbGRlciwgZnVsbC5uYW1lcyA9IFRSVUUsIHJlY3Vyc2l2ZSA9IEZBTFNFKQ0KICBuZXN0ZWRfZm9sZGVyc19iYXRjaDUgPC0gYyhuZXN0ZWRfZm9sZGVyc19iYXRjaDUsIG5lc3RlZF9mb2xkZXJfYmF0Y2g1KQ0KfQ0KbmVzdGVkX2ZvbGRlcnNfYmF0Y2g1DQpgYGANCg0KDQoNCmluaXRpYWxpc2UgYSBsaXN0IHRvIGhvbGQgQ1NWIGZpbGUgcGF0aHMNCmBgYHtyfQ0KY3N2X2ZpbGVzX2JhdGNoNSA8LSBsaXN0KCkNCmBgYA0KDQoNCmxvb3AgdGhyb3VnaCBlYWNoIHBhcnRpY2lwYW50IGZvbGRlcg0KYGBge3J9DQpmb3IgKGZvbGRlciBpbiBuZXN0ZWRfZm9sZGVyc19iYXRjaDUpIHsNCiAgdHh0X2ZpbGVzIDwtIGxpc3QuZmlsZXMocGF0aCA9IGZvbGRlciwgcGF0dGVybj0gIlxcLnR4dCQiLCBmdWxsLm5hbWVzID0gVFJVRSkNCiAgY3N2X2ZpbGVzX2JhdGNoNSA8LSBjKGNzdl9maWxlc19iYXRjaDUsIGxhcHBseSh0eHRfZmlsZXMsIGNvbnZlcnRfdHh0X3RvX2NzdikpDQp9DQpgYGANCg0KDQpyZWFkIGFsbCBjc3YgZmlsZXMgaW50byBhIGxpc3Qgb2YgZGF0YSBmcmFtZXMNCmBgYHtyfQ0KZGF0YV9mcmFtZXNfYmF0Y2g1IDwtIGxhcHBseShjc3ZfZmlsZXNfYmF0Y2g1LCByZWFkLmNzdikNCmBgYA0KDQoNCmBgYHtyfQ0KbWVyZ2VkX2RmX2JhdGNoNSA8LSBkby5jYWxsKHJiaW5kLmZpbGwsIGRhdGFfZnJhbWVzX2JhdGNoNSkNCm1lcmdlZF9kZl9iYXRjaDUgPC0gZGlzdGluY3QobWVyZ2VkX2RmX2JhdGNoNSkNCnByaW50KG1lcmdlZF9kZl9iYXRjaDUpDQpgYGANCg0KQ3JlYXRlIGNzdiBvZiBtZXJnZWQsIHJhdyBkYXRhDQpgYGB7cn0NCndyaXRlLmNzdihtZXJnZWRfZGZfYmF0Y2g1LCAicGFpcnNfNV9tZXJnZWRfZGYuY3N2IikNCmBgYA0KDQoNCkJJRyBNRVJHRQ0KDQpOb3cgbWVyZ2UgdGhlIGRhdGFzZXRzIHRvZ2V0aGVyIHRvIGNyZWF0ZSB0aGUgbWFzdGVyIGRhdGFzZXQNCg0KYGBge3J9DQpjb21iaW5lZF9waWxvdF9iYXRjaGVzIDwtIGJpbmRfcm93cyhtZXJnZWRfZGZfYmF0Y2gxLCBtZXJnZWRfZGZfYmF0Y2gyLCBtZXJnZWRfZGZfYmF0Y2gzLCBtZXJnZWRfZGZfYmF0Y2g0LCBtZXJnZWRfZGZfYmF0Y2g1KQ0KY29tYmluZWRfcGlsb3RfYmF0Y2hlcw0KYGBgDQoNCg0KQ3JlYXRlIGNzdiBvZiBtZXJnZWQsIHJhdyBkYXRhDQpgYGB7cn0NCndyaXRlLmNzdihjb21iaW5lZF9waWxvdF9iYXRjaGVzLCAiY29tYmluZWRfcGlsb3RfYmF0Y2hlcy5jc3YiKQ0KYGBgDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg0KDQoNCg==